APP Puzzle
	TYPE $1000
	ICON "\OPD\PUZZLE.PIC"
ENDA

PROC main:
	global n%,x%,y%,b%(17)
	local g%
	randomize (minute*60+second)
	do
		init:
		do
			g%=get
			if g%=256
				moveup:
			elseif g%=257
				movedown:
			elseif g%=258
				moverigh:
			elseif g%=259
				moveleft:
			elseif g%=13 or g%=27
				break
			endif
			g%=0
			do
				g%=g%+1
			until b%(g%)<>g%
			if g%=17
				winner:
				break
			endif
		until 0
		if g%=27
			stop
		endif
	until 0
ENDP

PROC moveup:
	if y%<3
		n%=b%(x%+(y%+1)*4)
		b%(x%+y%*4)=n%
		drawPiec:
		y%=y%+1
		n%=16
		b%(x%+y%*4)=n%
		drawPiec:
	endif
ENDP

PROC movedown:
	if y%>0
		n%=b%(x%+(y%-1)*4)
		b%(x%+y%*4)=n%
		drawPiec:
		y%=y%-1
		n%=16
		b%(x%+y%*4)=n%
		drawPiec:
	endif
ENDP

PROC moverigh:
	if x%>1
		n%=b%(x%-1+y%*4)
		b%(x%+y%*4)=n%
		drawPiec:
		x%=x%-1
		n%=16
		b%(x%+y%*4)=n%
		drawPiec:
	endif
ENDP

PROC moveleft:
	if x%<4
		n%=b%(x%+1+y%*4)
		b%(x%+y%*4)=n%
		drawPiec:
		x%=x%+1
		n%=16
		b%(x%+y%*4)=n%
		drawPiec:
	endif
ENDP

PROC init:
	local r,i%
	gcls
	gupdate off
	gfont 8
	gstyle 1+8+32
	gat 20,40
	gprint "Sliding"
	gat 52,80
	gprint "Puzzle"
	gstyle 0
	gat 44,130
	gprint "©1995"
	gat 30,150
	gprint "Mark Reid"
	gat 340,30
	gprint "Use arrow"
	gat 340,50
	gprint "keys to slide"
	gat 340,70
	gprint "blocks into"
	gat 340,90
	gprint "empty space."
	gat 332,130
	gprint "ENTER=Restart"
	gat 332,150
	gprint "ESC=Quit"
	
	gat 151,0
	gbox 163,159
	gat 152,1
	gbox 161,157
	
	n%=0
	y%=0
	do
		x%=1
		do
			n%=n%+1
			b%(x%+y%*4)=n%
			drawPiec:
			x%=x%+1
		until x%=5
		y%=y%+1
	until y%=4
	x%=4
	y%=3
	i%=0
	do
		r=rnd*3+1
		if x%>r
			moverigh:
		else
			moveleft:
		endif
		r=rnd*3
		if y%>r
			movedown:
		else
			moveup:
		endif
		i%=i%+1
		if key=27
			stop
		endif
	until i%=60
	gupdate on
ENDP

PROC winner:
	local i%
	do
		gat 152,1
		gfill 161,157,2
		pause 5
		i%=i%+1
	until i%=12
ENDP


PROC drawPiec:
	gstyle 1+8
	gat x%*40+112,y%*39+1
	if n%<10
		gfill 41,40,1
		gbox 41,40
		gmove 15,33
		gprint n%
	elseif n%=16
		gfill 41,40,0
		gmove 6,6
		gpatt -1,34,33,3
	else
		gfill 41,40,1
		gbox 41,40
		gmove 9,33
		gprint n%
	endif
ENDP
